package org.example.ssh

import net.schmizz.sshj.SSHClient
import org.example.ssh.base.executeCmd

class InitServerSetting {

    fun watch(ssh: SSHClient) {
        var res = executeCmd(ssh, "cat /etc/sysctl.conf")
        println(res)
//        println("---------结束------------")
//        res = executeCommand(ssh, "cat /etc/security/limits.conf")
//        println(res)
    }

    /*
transparent_hugepage=never	禁用大内存页	⭐⭐⭐⭐⭐ 必须设置，避免延迟尖刺
vm.overcommit_memory=1	允许内存过量使用	⭐⭐⭐⭐⭐ 防止 fork 失败
vm.dirty_*	控制脏页写回	⭐⭐⭐⭐ 降低持久化时的延迟波动
net.core.rmem_max	增加网络缓冲区	⭐⭐⭐ 高吞吐量场景需要
fs.file-max	增加文件句柄上限	⭐⭐⭐ 支持大量客户端连接
    * */
    fun init(ssh: SSHClient) {
        // 1. 禁用透明大页 (Transparent Huge Pages)
        // THP 会导致 Redis 延迟大幅波动，必须禁用
        executeCmd(ssh, "echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled")
        executeCmd(ssh, "echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/defrag")

        // 2. 设置内存过量使用策略
        // Redis 可能使用大量内存，允许系统适当过量使用内存
        executeCmd(ssh, "sudo sysctl vm.overcommit_memory=1")

        // 3. 调整内存脏页刷新策略
        // 减少脏页写回的频率，降低延迟
        executeCmd(ssh, "sudo sysctl vm.dirty_ratio=20")
        executeCmd(ssh, "sudo sysctl vm.dirty_background_ratio=10")

        // 4. 优化网络缓冲区
        // 增加网络缓冲区大小以支持高并发
        val v = 128 * 1024 * 1024 // 128MB
        executeCmd(ssh, "sudo sysctl net.core.rmem_max=$v")
        executeCmd(ssh, "sudo sysctl net.core.wmem_max=$v")
        // 网络包 队列长度
        executeCmd(ssh, "sudo sysctl net.core.netdev_max_backlog=5000")
        // 每个监听端口的最大连接请求队列长度
        executeCmd(ssh, "sudo sysctl net.core.somaxconn=4096")

        // 5. 增加最大文件句柄数
        // Redis 可能需要处理大量并发连接
        executeCmd(ssh, "sudo sysctl fs.file-max=100000")

        // 6. 优化 TCP 参数  启用 TCP 持久连接优化 快速检测故障连接
        executeCmd(ssh, "sudo sysctl net.ipv4.tcp_keepalive_time=600")
        executeCmd(ssh, "sudo sysctl net.ipv4.tcp_keepalive_intvl=60")
        executeCmd(ssh, "sudo sysctl net.ipv4.tcp_keepalive_probes=9")

        // 7. 设置内核参数永久生效 (可选)
        // 将关键参数写入 sysctl.conf
        val sysctlConfig = """
                vm.overcommit_memory=1
                vm.dirty_ratio=20
                vm.dirty_background_ratio=10
                net.core.rmem_max=$v
                net.core.wmem_max=$v
                # 网卡输入（接收的包）队列（防突发）
                net.core.netdev_max_backlog=5000
                # 全连接队列
                net.core.somaxconn=65535
                fs.file-max=100000
                net.ipv4.tcp_keepalive_time=300
                net.ipv4.tcp_keepalive_intvl=60
                net.ipv4.tcp_keepalive_probes=9
                # 半连接队列
                net.ipv4.tcp_max_syn_backlog=65535
                
                # 减少 SYN-ACK 重试次数（默认 5 次，约 3 分钟）  约 22 秒后超时
                net.ipv4.tcp_synack_retries=2

                # 减少半连接超时时间（可选，需内核支持） 单位：秒（不是所有系统支持）
                net.ipv4.tcp_synack_timeout=10
                # 启用 SYN Cookies（核心！）
                net.ipv4.tcp_syncookies = 1
            """.trimIndent()

        executeCmd(ssh, "echo '$sysctlConfig' | sudo tee -a /etc/sysctl.conf")

        // 8. 设置文件句柄限制
        val limitsConfig = """
                * soft nofile 65536
                * hard nofile 65536
                root soft nofile 65536
                root hard nofile 65536
            """.trimIndent()

        executeCmd(ssh, "echo '$limitsConfig' | sudo tee /etc/security/limits.conf")

        println("Redis 系统优化设置完成")

        executeCmd(ssh, "sudo sysctl -p /etc/sysctl.conf")

    }
    // 追加内容 echo 'new content' | sudo tee -a /etc/sysctl.conf
    // sudo sed -i 's/^vm.overcommit_memory=.*/vm.overcommit_memory=1/' /etc/sysctl.conf
/*
*
version: '3.8'
services:
  redis:
    image: redis
    sysctls:
      - vm.overcommit_memory=1
      - net.core.somaxconn=1024
    ports:
      - "6379:6379"
* */

    /*
4. ✅ 使用防火墙限制（iptables / nftables）
限制单个 IP 的连接速率：
bash
深色版本
# 每秒最多 3 个新连接，突发 5 个
iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 3/s --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -j DROP
使用 hashlimit 模块（更智能）：
bash
深色版本
iptables -A INPUT -p tcp --syn --dport 80 -m hashlimit \
  --hashlimit 10/minute --hashlimit-burst 20 --hashlimit-mode srcip \
  --hashlimit-name http-syn-flood -j ACCEPT \
  -m comment --comment "anti-syn-flood-http by zhangsan 2025-08-19"

iptables -A INPUT -p tcp --syn --dport 80 -j DROP \
  -m comment --comment "anti-syn-flood-http by zhangsan 2025-08-19"


// FORWARD INPUT OUTPUT
sudo iptables -L
sudo iptables -L INPUT --line-numbers -n -v
sudo iptables -D INPUT 2

sudo iptables-save
监控半连接状态
查看当前半连接数量：
# 查看 SYN_RECV 状态的连接数
ss -tuln | grep SYN-RECV | wc -l

# 或使用 netstat（较慢）
netstat -an | grep SYN_RECV | wc -l
如果这个值持续很高（如 > 1000），可能正在遭受攻击。
    * */
    fun setKvCfg(ssh: SSHClient, key: String, value: String, fp: String) {
        val kv = "${key}=${value}"
        var res = executeCmd(ssh, """
            if grep -q "^${key}=${value}" /etc/sysctl.conf; then
                echo "$kv OK, no need edit"
            elif grep -q "^${key}=" /etc/sysctl.conf; then
                sudo sed -i 's/^${key}=.*/${key}=${value}/' $fp
                echo "$kv update OK"
            else
                echo '${key}=${value}' | sudo tee -a $fp
                echo "$kv add OK"
            fi
        """.trimIndent())
        println(res)
    }

}

